package com.hai.qtalk.base;

import java.nio.channels.SelectionKey;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.hai.qtalk.base.SelectionKeyMap;

/**
 * 存放SocketChannel的缓存器
 * 
 * @author xinhai
 */
public class SelectionKeyMap {
	private ConcurrentHashMap<Integer, SelectionKey> map;
	private static SelectionKeyMap instance;

	// 私有构造器，防止被外面实例化改对像
	private SelectionKeyMap() {
		map = new ConcurrentHashMap<Integer, SelectionKey>();
	}

	// 单例模式向外面提供该对象
	public static SelectionKeyMap getInstance() {
		if (instance == null) {
			instance = new SelectionKeyMap();
		}
		return instance;
	}

	// 添加SocketChannel的方法
	public void add(Integer id, SelectionKey key) {
		map.put(id, key);
	}

	// 移除SocketChannel的方法
	public void remove(Integer id) {
		map.remove(id);
	}

	// 返回当前保存的SocketChannel数量
	public int size() {
		return map.size();
	}

	// 取出SocketChannel的方法,群聊的话，可以遍历取出对应写线程
	public SelectionKey getById(Integer id) {
		return map.get(id);
	}

	// 得到所有SocketChannel方法，用于向所有在线用户发送广播
	public List<SelectionKey> getAll() {
		List<SelectionKey> list = new ArrayList<SelectionKey>();
		for (Map.Entry<Integer, SelectionKey> entry : map.entrySet()) {
			list.add(entry.getValue());
		}
		return list;
	}
}
